bitkeeper revision 1.1159.212.112 (4207b382VvZgSA3Pg79SQESssYJbHQ)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Mon, 7 Feb 2005 18:29:22 +0000 (18:29 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Mon, 7 Feb 2005 18:29:22 +0000 (18:29 +0000)
More x86_64 fixes.
Signed-off-by: keir.fraser@cl.cam.ac.uk
xen/arch/x86/domain.c
xen/arch/x86/x86_64/entry.S
xen/include/public/xen.h

index f456a7b79a70ec552c33261a5c9306d7758a87e8..fa441175cd2d01f455d53bfe2b312a8f75e054f5 100644 (file)
@@ -633,7 +633,6 @@ unsigned long hypercall_create_continuation(
 {
     struct mc_state *mcs = &mc_state[smp_processor_id()];
     execution_context_t *ec;
-    unsigned long *preg;
     unsigned int i;
     va_list args;
 
@@ -653,10 +652,34 @@ unsigned long hypercall_create_continuation(
         ec->eax  = op;
         ec->eip -= 2;  /* re-execute 'int 0x82' */
         
-        for ( i = 0, preg = &ec->ebx; i < nr_args; i++, preg++ )
-            *preg = va_arg(args, unsigned long);
-#else
-        preg = NULL; /* XXX x86/64 */
+        for ( i = 0; i < nr_args; i++ )
+        {
+            switch ( i )
+            {
+            case 0: ec->ebx = va_arg(args, unsigned long); break;
+            case 1: ec->ecx = va_arg(args, unsigned long); break;
+            case 2: ec->edx = va_arg(args, unsigned long); break;
+            case 3: ec->esi = va_arg(args, unsigned long); break;
+            case 4: ec->edi = va_arg(args, unsigned long); break;
+            case 5: ec->ebp = va_arg(args, unsigned long); break;
+            }
+        }
+#elif defined(__x86_64__)
+        ec->rax  = op;
+        ec->rip -= 2;  /* re-execute 'syscall' */
+        
+        for ( i = 0; i < nr_args; i++ )
+        {
+            switch ( i )
+            {
+            case 0: ec->rdi = va_arg(args, unsigned long); break;
+            case 1: ec->rsi = va_arg(args, unsigned long); break;
+            case 2: ec->rdx = va_arg(args, unsigned long); break;
+            case 3: ec->r10 = va_arg(args, unsigned long); break;
+            case 4: ec->r8  = va_arg(args, unsigned long); break;
+            case 5: ec->r9  = va_arg(args, unsigned long); break;
+            }
+        }
 #endif
     }
 
index 447b77e9b0a073ba50dfa8a8ad2a206dcfda8b83..153ae6ad6f71b43722a7e0ec181a44be32fdc662 100644 (file)
 #include <asm/apicdef.h>
 #include <public/xen.h>
 
+
+/*
+ * %rax                            = hypercall vector
+ * %rdi, %rsi, %rdx, %r10, %r8, %9 = hypercall arguments
+ * %r11, %rcx                      = SYSCALL-saved %rflags and %rip
+ * NB. We must move %r10 to %rcx for C function-calling ABI.
+ */
 ENTRY(hypercall)
         sti
         movl  $__GUEST_SS,8(%rsp)
@@ -19,6 +26,7 @@ ENTRY(hypercall)
         pushq %rcx
         pushq $0
         SAVE_ALL
+        movq  %r10,%rcx
         andq  $(NR_hypercalls-1),%rax
         leaq  SYMBOL_NAME(hypercall_table)(%rip),%rcx
         callq *(%rcx,%rax,8)
@@ -39,6 +47,7 @@ restore_all_xen:
 
 error_code:
         SAVE_ALL
+        sti
         movq  %rsp,%rdi
         movl  XREGS_entry_vector(%rsp),%eax
         leaq  SYMBOL_NAME(exception_table)(%rip),%rdx
index ac643140c46353d875e8903f8d1f74237d9ecad7..fa10d5326b8cd539ea977019806962bc8ab55e3e 100644 (file)
  * XEN "SYSTEM CALLS" (a.k.a. HYPERCALLS).
  */
 
-/* EAX = vector; EBX, ECX, EDX, ESI, EDI = args 1, 2, 3, 4, 5. */
+/*
+ * x86_32: EAX = vector; EBX, ECX, EDX, ESI, EDI = args 1, 2, 3, 4, 5.
+ *         EAX = return value
+ *         (argument registers may be clobbered on return)
+ * x86_64: RAX = vector; RDI, RSI, RDX, R10, R8, R9 = args 1, 2, 3, 4, 5, 6. 
+ *         RAX = return value
+ *         (argument registers not clobbered on return; RCX, R11 are)
+ */
 #define __HYPERVISOR_set_trap_table        0
 #define __HYPERVISOR_mmu_update            1
 #define __HYPERVISOR_set_gdt               2